﻿using System;
using Kaesoft.Hospedaje.Common;
using System.Linq;
using System.Collections.Generic;
using Kaesoft.Hospedaje.Entities;
using System.Windows;
using System.ComponentModel;

namespace Kaesoft.Hospedaje.Admin
{
    public class AdministracionPerfilViewModel : ViewModelBase
    {
        #region Variables
        private ArbolPerfilViewModel viewModelArbolPerfil;
        private bool modoSoloLecturaCombo = false;
        private bool isEnabledCargar;
        public bool ModoSoloLectura1 = true;
        private Perfil perfilActual;
        private Opcion opcionActual;
        private List<PerfilOpcion> listaPerfilOpcion;
        private List<PerfilOpcionOperacion> listaPerfilOpcionOperacion;
        private MessageWindowViewModel messageBox;
        private ArbolOpcionesPerfilViewModel viewModelArbolOpcionesPerfil;
        private GridOperacionesViewModel _viewModelGridOperaciones;
        private Opcion perfilActualS;

        public Opcion PerfilActualS
        {
            get { return perfilActualS; }
            set
            {
                if (perfilActualS != value)
                {
                    perfilActualS = value;
                    OnPropertyChanged("PerfilActualS");
                }
            }
        }

        public GridOperacionesViewModel ViewModelGridOperaciones
        {
            get { return _viewModelGridOperaciones; }
            set
            {
                if (_viewModelGridOperaciones != value)
                {
                    _viewModelGridOperaciones = value;
                    OnPropertyChanged("ViewModelGridOperaciones");
                }
            }
        }

        public MessageWindowViewModel ViewModelMessageBox
        {
            get { return messageBox; }
            set
            {
                if (messageBox != value)
                {
                    messageBox = value;
                    OnPropertyChanged("ViewModelMessageBox");
                }
            }
        }

        #endregion

        #region Propiedades
        public List<PerfilOpcionOperacion> ListaPerfilOpcionOperacion
        {
            get { return listaPerfilOpcionOperacion; }
            set
            {
                if (listaPerfilOpcionOperacion != value)
                {
                    listaPerfilOpcionOperacion = value;
                    OnPropertyChanged("ListaPerfilOpcionOperacion");
                }
            }
        }
        public List<PerfilOpcion> ListaPerfilOpcion
        {
            get { return listaPerfilOpcion; }
            set
            {
                if (listaPerfilOpcion != value)
                {
                    listaPerfilOpcion = value;
                    OnPropertyChanged("ListaPerfilOpcion");
                }
            }
        }
        public Opcion OpcionActual
        {
            get { return opcionActual; }
            set
            {
                if (opcionActual != value)
                {
                    opcionActual = value;
                    OnPropertyChanged("OpcionActual");
                }
            }
        }
        public Perfil PerfilActual
        {
            get { return perfilActual; }
            set
            {
                if (perfilActual != value)
                {
                    perfilActual = value;
                    OnPropertyChanged("PerfilActual");
                }
            }
        }

        public ArbolOpcionesPerfilViewModel ViewModelArbolOpcionesPerfil
        {
            get { return viewModelArbolOpcionesPerfil; }
            set
            {
                if (viewModelArbolOpcionesPerfil != value)
                {
                    viewModelArbolOpcionesPerfil = value;
                    OnPropertyChanged("ViewModelArbolOpcionesPerfil");
                }
            }
        }

        public ArbolPerfilViewModel ViewModelArbolPerfil
        {
            get { return viewModelArbolPerfil; }
            set
            {
                if (viewModelArbolPerfil != value)
                {
                    viewModelArbolPerfil = value;
                    OnPropertyChanged("ViewModelArbolPerfil");
                }
            }
        }


        /// <summary>
        /// para activar y desactivar los combos
        /// </summary>
        public bool ModoSoloLecturaCombo
        {
            get { return modoSoloLecturaCombo; }
            set
            {
                modoSoloLecturaCombo = value;
                OnPropertyChanged("ModoSoloLecturaCombo");
            }
        }
        /// <summary>
        /// Botón cargar
        /// </summary>
        public bool IsEnabledCargar
        {
            get
            {
                if (!ModoSoloLecturaCombo)
                    return false;

                return isEnabledCargar;
            }
            set
            {
                if (isEnabledCargar != value)
                {
                    isEnabledCargar = value;
                    OnPropertyChanged("IsEnabledCargar");
                }
            }
        }
        /// <summary>
        /// para activar y desactivar cajas de texto y grids
        /// </summary>
        public bool ModoSoloLectura
        {
            get { return ModoSoloLectura1; }
            set
            {
                ModoSoloLectura1 = value;
                OnPropertyChanged("ModoSoloLectura");
            }
        }
        #endregion

        #region Constructor
        /// <summary>
        /// Metodo Constructor del MainPageViewModel 
        /// </summary>
        public AdministracionPerfilViewModel()
        {
            Procesando = true;
            CargaValoresIniciales();

            ViewModelArbolPerfil.OnNodoSeleccionado += new EventHandler<EventArgs<Arbol>>(ViewModelArbolPerfil_OnNodoSeleccionado);
            ViewModelArbolOpcionesPerfil.OnNodoSeleccionado += new EventHandler<EventArgs<Arbol>>(ViewModelArbolOpcionesPerfil_OnNodoSeleccionado);
            
            BarraTareasViewModel.BotonTareaClick += BotonOperacionClick;
        }
        #endregion

        #region Metodos Privados
        #region Inicializa Valores
        /// <summary>
        /// Inicializa los Controles de usuario y propiedades necesarias para el proceso de mantenimiento de Perfiles
        /// </summary>
        private void CargaValoresIniciales()
        {
           
            MessageBoxWindow = new MessageWindowView();
            //Perfiles
            ViewModelArbolPerfil = new ArbolPerfilViewModel();
            ViewModelArbolPerfil.SaveCompleted += new EventHandler(ViewModelArbolPerfil_SaveCompleted);
            ViewModelArbolPerfil.EstadoProcesando += new EventHandler<EventArgs<bool>>(ViewModelArbolOpcionesPerfil_EstadoProcesando);
            ViewModelArbolPerfil.SetEdition += new EventHandler(ViewModelArbolPerfil_SetEdition);
            ViewModelArbolPerfil.EliminarCompleted += new EventHandler(ViewModelArbolPerfil_EliminarCompleted);  
            //PerfilOpciones
            ViewModelArbolOpcionesPerfil = new ArbolOpcionesPerfilViewModel();
            ViewModelArbolOpcionesPerfil.EstadoProcesando += new EventHandler<EventArgs<bool>>(ViewModelArbolOpcionesPerfil_EstadoProcesando);
            ViewModelArbolOpcionesPerfil.SetEdition += new EventHandler(ViewModelArbolOpcionesPerfil_SetEdition);
            ViewModelArbolOpcionesPerfil.SaveCompleted += new EventHandler(ViewModelArbolOpcionesPerfil_SaveCompleted);
            //GridOperaciones
            ViewModelGridOperaciones = new GridOperacionesViewModel();
            ViewModelGridOperaciones.SaveCompleted += new EventHandler(ViewModelArbolPerfil_SaveCompleted);
            ViewModelGridOperaciones.SetEdition += new EventHandler(ViewModelGridOperaciones_SetEdition);
            ViewModelGridOperaciones.EstadoProcesando += new EventHandler<EventArgs<bool>>(ViewModelArbolOpcionesPerfil_EstadoProcesando);
            
            BarraTareasViewModel = new BarraTareasViewModel();

            ViewModelArbolPerfil.ModoEdicion(true);
            BarraTareasViewModel.IsVisibleGuardar = true;
            BarraTareasViewModel.IsEnableGuardar = false;
            BarraTareasViewModel.IsVisibleNuevo = true;
            BarraTareasViewModel.IsEnableNuevo = false;
            BarraTareasViewModel.IsVisibleEditar = true;
            BarraTareasViewModel.IsEnableEditar = false;
            BarraTareasViewModel.IsVisibleCancelar = true;
            BarraTareasViewModel.IsEnableCancelar = false;
        }

        void ViewModelArbolPerfil_EliminarCompleted(object sender, EventArgs e)
        {
            var fechaNivelCero = new DateTime(1, 1, 1);
            IsDirty = false;
            BarraTareasViewModel.IsEnableGuardar = false;
            if (PerfilActual.fechaCreacion == fechaNivelCero)
            {
                BarraTareasViewModel.IsEnableEditar = false;
                BarraTareasViewModel.IsEnableNuevo = true;
            }
            else
            {
                BarraTareasViewModel.IsEnableEditar = true;
                BarraTareasViewModel.IsEnableNuevo = false;
            }
           
            viewModelArbolPerfil.NodoSeleccionado = viewModelArbolPerfil.LstPerfil.First();
            ViewModelArbolOpcionesPerfil.InicializaArbol();
            viewModelArbolPerfil.ModoEdicion(true);
            ViewModelGridOperaciones.ModoEdicion(false);
            ViewModelArbolOpcionesPerfil.EsHabilitado = false;
            ModoSoloLectura = true;
            ViewModelGridOperaciones.CargaGridOperaciones(Guid.NewGuid(), Guid.NewGuid(), 0);
        }

        void ViewModelArbolOpcionesPerfil_SaveCompleted(object sender, EventArgs e)
        {
            viewModelArbolPerfil.ModoEdicion(true);
            ModoSoloLectura = true;
            ViewModelArbolOpcionesPerfil.EsHabilitado = false;
            BarraTareasViewModel.IsEnableGuardar = false;
           
            var fechaNivelCero = new DateTime(1, 1, 1);
            IsDirty = false;
            BarraTareasViewModel.IsEnableGuardar = false;
            if (PerfilActual.fechaCreacion == fechaNivelCero)
            {
                BarraTareasViewModel.IsEnableEditar = false;
                BarraTareasViewModel.IsEnableNuevo = true;
            }
            else
            {
                BarraTareasViewModel.IsEnableEditar = true;
                BarraTareasViewModel.IsEnableNuevo = false;
            }
            BarraTareasViewModel.IsEnableEditar = true;
            ViewModelArbolOpcionesPerfil.ListaPerfilOpcionTemporal = ViewModelArbolOpcionesPerfil.CollectionTemp.ToList ();
        }


        void ViewModelGridOperaciones_SetEdition(object sender, EventArgs e)
        {
            viewModelArbolPerfil.ModoEdicion(false);
            ModoSoloLectura = true;
            ViewModelArbolOpcionesPerfil.EsHabilitado = false;
        }

        void ViewModelArbolPerfil_SetEdition(object sender, EventArgs e)
        {
            ViewModelArbolOpcionesPerfil.EsHabilitado = false;
            ViewModelGridOperaciones.ModoEdicion(false);
            viewModelArbolPerfil.ModoEdicion(true);
        }

        void ViewModelArbolOpcionesPerfil_SetEdition(object sender, EventArgs e)
        {
            ModoSoloLectura = true;
            ViewModelGridOperaciones.ModoEdicion(false);
            ViewModelArbolPerfil.ModoEdicion(false);  
        }

        void ViewModelArbolOpcionesPerfil_EstadoProcesando(object sender, EventArgs<bool> e)
        {
            Procesando = e.Data;
        }

        void ViewModelArbolPerfil_SaveCompleted(object sender, EventArgs e)
        {
            ModoSoloLectura = true;
            viewModelArbolPerfil.ModoEdicion(true);
                      
            ViewModelArbolOpcionesPerfil.EsHabilitado = false;
            ViewModelGridOperaciones.ModoEdicion(false);
               BarraTareasViewModel.IsEnableGuardar = false;
               var fechaNivelCero = new DateTime(1, 1, 1);
               IsDirty = false;
               BarraTareasViewModel.IsEnableGuardar = false;
               if (PerfilActual.fechaCreacion == fechaNivelCero)
               {
                   BarraTareasViewModel.IsEnableEditar = false;
                   BarraTareasViewModel.IsEnableNuevo = true;
               }
               else
               {
                   BarraTareasViewModel.IsEnableEditar = true;
                   BarraTareasViewModel.IsEnableNuevo = false;
               }
           
        }
        #endregion
        #region Operaciones del menú
        /// <summary>
        /// para saber q boton de la barra de tareas presiono
        /// </summary>
        /// <param name="sender">objeto enviado barra de tareas</param>
        /// <param name="e">q boton presiono </param>
        private void BotonOperacionClick(object sender, EventArgs<string> e)
        {
            switch (e.Data.ToString())
            {
                case "Editar":
                    OpcionEditar();
                    break;
                case "Cancelar":
                    OpcionCancelar();
                    break;
                case "Guardar":
                    OpcionGrabar();
                    break;
                case "Nuevo":
                    OpcionNuevo();
                    break;
                default:
                    break;
            }
        }
        /// <summary>
        /// Editar Información del Perfil Seleccionado
        /// </summary>
        private void OpcionEditar()
        {
            ViewModelArbolOpcionesPerfil.EsHabilitado = true;
            ViewModelGridOperaciones.ModoEdicion(true);
            BarraTareasViewModel.IsEnableGuardar = true;
            BarraTareasViewModel.IsEnableNuevo = false;
            BarraTareasViewModel.IsEnableEditar = false;
            ModoSoloLectura = false;
            IsEnabledCargar = true;
        }
        /// <summary>
        /// Cancela Acciones e inicializa el Menú
        /// </summary>
        private void OpcionCancelar()
        {
            var fechaNivelCero = new DateTime(1, 1, 1);
            IsDirty = false;
            BarraTareasViewModel.IsEnableGuardar = false;
            if (PerfilActual.fechaCreacion == fechaNivelCero)
            {
                BarraTareasViewModel.IsEnableEditar = false;
                BarraTareasViewModel.IsEnableNuevo = true;
            }
            else
            {
                BarraTareasViewModel.IsEnableEditar = true;
                BarraTareasViewModel.IsEnableNuevo = false;
            }
            viewModelArbolPerfil.NodoSeleccionado = viewModelArbolPerfil.LstPerfil.First(); 
            ViewModelArbolOpcionesPerfil.InicializaArbol();
            viewModelArbolPerfil.ModoEdicion(true);
            ViewModelGridOperaciones.ModoEdicion(false);
            ViewModelArbolOpcionesPerfil.EsHabilitado = false;
            ModoSoloLectura = true;
            ViewModelGridOperaciones.CargaGridOperaciones(Guid.NewGuid(), Guid.NewGuid(), 0);
        }
        /// <summary>
        /// Habilita todos los paneles para ingresar un nuevo perfil
        /// </summary>
        private void OpcionNuevo()
        {
            PerfilActual.nombre = string.Empty;
            ((INotifyPropertyChanged)PerfilActual).PropertyChanged += new PropertyChangedEventHandler(AdministracionPerfilViewModel_PropertyChanged);
            IsDirty = true;
            IsEnabledCargar = false;
            BarraTareasViewModel.IsEnableGuardar = true;
            BarraTareasViewModel.IsEnableEditar = false;
            ModoSoloLectura = false;
        }
        /// <summary>
        /// Grabar datos
        /// </summary>
        private void OpcionGrabar()
        {
            ErrorList.Clear();
            if (PerfilActual.idPerfil == Guid.Empty)
            {
                PerfilActual = ViewModelArbolOpcionesPerfil.PerfilSeleccionado;
               
                PerfilActual.Validator.ValidateAll().ToList().ForEach(a => ErrorList.Add(a));
                if (ErrorList.Count == 0)
                {
                    ViewModelArbolPerfil.GuardaPerfilActual(PerfilActual);
                    CambiaEstadoEditable();
                }
                else
                {
                    MessageWindowViewModel msgWindowViewModel = new MessageWindowViewModel(ErrorList.First().ErrorText, MessageBoxButtons.Ok, MessageBoxIcon.Error);
                    MessageBoxWindow.DataContext = msgWindowViewModel;
                    msgWindowViewModel.Closing += (msgsender, ev) =>
                    {
                        MessageBoxWindow.Close();
                        if (ev.Data != MessageBoxResult.OK) return;
                    };
                    MessageBoxWindow.Show();
                }
            }
            else
            {
                if (ViewModelGridOperaciones.IsDirty)
                {
                    ViewModelGridOperaciones.Guardar();
                }
                // Actualiza perfil
                if (viewModelArbolPerfil.IsDirty)
                {
                    viewModelArbolPerfil.guardar(PerfilActual);
                }
                PerfilActual.Validator.ValidateAll().ToList().ForEach(a => ErrorList.Add(a));
                if (ErrorList.Count == 0)
                {
                    if (ViewModelArbolOpcionesPerfil.IsDirty)
                    {
                        ViewModelArbolOpcionesPerfil.Guardar(PerfilActual);
                        CambiaEstadoEditable();
                    }
                }
                else
                {
                    MessageWindowViewModel msgWindowViewModel = new MessageWindowViewModel(ErrorList.First().ErrorText, MessageBoxButtons.Ok, MessageBoxIcon.Error);
                    MessageBoxWindow.DataContext = msgWindowViewModel;
                    msgWindowViewModel.Closing += (msgsender, ev) =>
                    {
                        MessageBoxWindow.Close();
                        if (ev.Data != MessageBoxResult.OK) return;
                    };
                    MessageBoxWindow.Show();
                }
            }
            viewModelArbolPerfil.ModoEdicion(true);
            BarraTareasViewModel.IsEnableGuardar = false;
            BarraTareasViewModel.IsEnableEditar = true ;
            ModoSoloLectura = true;
        }

        void AdministracionPerfilViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "nombre")
            {
                ViewModelArbolPerfil.ModoEdicion(false); 
            }
        }
        #endregion
        #region Eventos de Controles de Usuario
        /// <summary>
        /// Evento que se ejecuta cuando se selecciona un nodo Opcion
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ViewModelArbolOpciones_OnNodoSeleccionado(object sender, EventArgs<Arbol> e)
        {
            if (e.Data.Nivel >= 3 && PerfilActual != null)
                OpcionActual = e.Data.Entidad as Opcion;
            else
                OpcionActual = null;
        }

        private void ViewModelArbolOpcionesPerfil_OnNodoSeleccionado(object sender, EventArgs<Arbol> e)
        {

            Procesando = true;
            PerfilActualS = e.Data.Entidad as Opcion;
            PerfilActual = ViewModelArbolOpcionesPerfil.PerfilSeleccionado;

            if (ViewModelArbolOpcionesPerfil.CollectionTemp != null)
            {
                var lista = ViewModelArbolOpcionesPerfil.CollectionTemp.ToList(); ;
                var p = PerfilActual.idPerfil;
                var oP = PerfilActualS.idOpcion;

                var existe = lista.Where(a => a.idOpcion == oP).FirstOrDefault();
                if (existe != null)
                {
                    ViewModelGridOperaciones.ProcesarPerfilOperacion(p, oP);
                    ViewModelGridOperaciones.CargaGridOperaciones(p, oP, 1);
                }
                else
                {
                    ViewModelGridOperaciones.ProcesarPerfilOperacion(p, oP);
                    ViewModelGridOperaciones.CargaGridOperaciones(p, oP, 0);
                    Procesando = false;
                }
            }
            else
            {
                Procesando = false;
            }
        }

        /// <summary>
        /// Evento que se ejecuta cuando se selecciona un nodo Perfil
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ViewModelArbolPerfil_OnNodoSeleccionado(object sender, EventArgs<Arbol> e)
        {
            Procesando = true;
            if (e.Data.Entidad is Perfil)
            {
                BarraTareasViewModel.IsEnableGuardar = false;
                BarraTareasViewModel.IsEnableCancelar = true;
                if (e.Data.Nivel == 0)
                {
                    BarraTareasViewModel.IsEnableNuevo = true;
                    BarraTareasViewModel.IsEnableEditar = false;
                }
                else
                {
                    BarraTareasViewModel.IsEnableNuevo = false;
                    BarraTareasViewModel.IsEnableEditar = true;
                }
                PerfilActual = e.Data.Entidad as Perfil;
                ViewModelGridOperaciones.CargaGridOperaciones(Guid.NewGuid(), Guid.NewGuid(), 0);
                ViewModelArbolOpcionesPerfil.PerfilSeleccionado =  PerfilActual;
                ViewModelArbolOpcionesPerfil.ListaPerfilOpcionActual = PerfilActual.PerfilOpcions.ToList();
                PerfilActual.PerfilOpcions.ToList().ForEach(a => a.PerfilOpcionOperacions.ToList().ForEach(b => ViewModelArbolOpcionesPerfil.ListaPerfilOpcionOperacionActual.Add(b)));
                viewModelArbolPerfil.PerfilInsertado = null;
                ViewModelArbolOpcionesPerfil.InicializaArbol();
            }
            else
            {
                BarraTareasViewModel.IsEnableNuevo = true;
                BarraTareasViewModel.IsEnableEditar = false;
                BarraTareasViewModel.IsEnableCancelar = true;
                PerfilActual = null;
                IsEnabledCargar = false;
                Procesando = false;
            }
        }

        public void CambiaEstadoEditable()
        {
            ModoSoloLectura = true;
            BarraTareasViewModel.IsEnableGuardar = false;
            BarraTareasViewModel.IsEnableCancelar = true;
            BarraTareasViewModel.IsEnableNuevo = false;
            BarraTareasViewModel.IsEnableEditar = true;
        }
        #endregion
        #endregion
    }
}
